package com.cskaoyan.javase.oop1._13block._1building;

/**
 * 构造代码块的执行原理:
 *      1.为什么和构造器一起执行?
 *      2.为什么和显式赋值体现为按照代码书写顺序执行?
 * 构造代码块之所以能够体现为上述执行方式,原因在于编译器在编译代码时,执行了特殊处理:
 * 编译后的代码,实际上并不存在构造代码块这种结构
 * 直接将成员变量的显式赋值和构造代码块中的代码智能地加入，类所有的构造器中的前几行：
 * 所谓智能是为了保证：成员变量的显式赋值和构造代码块，按照代码的书写顺序从上到下执行！
 *
 * 于是，我们可以得出以下结论：
 * 使用new对象的方式创建对象，不论使用哪个构造器，构造代码块都会随之执行。
 * 构造器是每一次new对象都会执行一次，所以构造代码块也会随之执行一次。
 * 构造代码块中的代码要放入构造器的首几行，所以在同一个类中，构造代码块总是先于它的构造器而执行。
 * @since 17:29
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // Cat c = new Cat();
        // System.out.println(c.price);
        // System.out.println(c.age);
        Cat c2 = new Cat(8, 888);
        System.out.println(c2.age);
        System.out.println(c2.price);
    }
}

class Cat {
    int age = 3;

    {
        price = 2000;
        age = 6;
    }

    double price = 1000;

    public Cat() {
    }

    public Cat(int age) {
        this.age = age;
    }

    public Cat(int age, double price) {
        this(age);
        this.price = price;
    }
}